package org.gary.core.factories;

import java.util.List;
import java.util.Map;

import lengreen.core.interfaces.Entity;

/**
 * 基础Service工厂接口
 * @author lengreen
 *
 * @param <E> 实体类Class
 */
public interface BasicServiceFactory<E> {

	/**
	 * 保存一个实体
	 * @param entity 需要保存的实体
	 * @return
	 */
	public String save(E entity);
	
	/**
	 * 删除一个实体
	 * @param entity
	 * @return
	 */
	public String delete(Entity entity);

	/**
	 * 更新一个实体
	 * @param entity
	 * @return
	 */
	public String update(Entity entity);
	
	/**
	 * 删除一组实体
	 * @param entity
	 * @param ids id的一个数组
	 */
	public void delete(Class<E> entity, Object[] ids);

	/**
	 * 更新一组实体
	 * @param entity
	 * @param ids id的一个数组
	 * @return
	 */
	public int[] update(Class<E> entity, Object[] ids, boolean visible);
	
	/**
	 * 通过id加载一个实体
	 * @param entity
	 * @param id
	 * @return
	 */
	public E load(Class<E> entity, int id);
	
	/**
	 * 通过id和lang加载一个实体
	 * @param entity
	 * @param id
	 * @return
	 */
	public E load(Class<E> entity, int id,Object lang);
	
	/**
	 * 通过lang加载一个实体
	 * @param entity
	 * @param id
	 * @return
	 */
	public E load(Class<E> entity, Object lang);

	/**
	 * 查询总记录条数
	 * @param entity
	 * @return
	 */
	public int selectTotalCount(Class<E> entity);

	/**
	 * 列出所有记录
	 * @param entity
	 * @return
	 */
	public List<E> list(Class<E> entity);
	
	/**
	 * 用groupBy对记录分组，groupby格式为entity.*
	 * @param entity
	 * @param groupBy 格式为entity.id
	 * @return
	 */
	public List<E> list(Class<E> entity, String groupBy);

	/**
	 * 分页显示，并通过orderBy排序
	 * @param entity
	 * @param pageNo 当前页码
	 * @param maxCount 每页多少记录
	 * @param orderBy 格式为{entity.id, entity.name}数组形式
	 * @return
	 */
	public List<E> list(Class<E> entity, int pageNo, int maxCount, Object[] orderBy);

	/**
	 * 通过where查找
	 * @param entity
	 * @param where where.put(" entity.name like ", "name");
	 * @param orderBy 格式为{entity.id, entity.name}数组形式
	 * @return
	 */
	public List<E> list(Class<E> entity, Map<String, Object> where,
			Object[] orderBy);

	/**
	 * 通过where分页查找
	 * @param entity
	 * @param pageNo 当前页码
	 * @param maxCount 每页多少记录
	 * @param where where.put(" entity.name like ", "name");
	 * @param orderBy 格式为{entity.id, entity.name}数组形式
	 * @return
	 */
	public List<E> list(Class<E> entity, int pageNo, int maxCount,
			Map<String, Object> where, Object[] orderBy);

	/**
	 * 查找方法
	 * @param entity
	 * @param pageNo 当前页码
	 * @param maxCount 每页多少记录
	 * @param where where.put(" entity.name like ", "name");
	 * @param groupBy 格式为entity.id
	 * @param orderBy 格式为{entity.id, entity.name}数组形式
	 * @return
	 */
	public List<E> list(Class<E> entity, int pageNo, int maxCount,
			Map<String, Object> where, String groupBy, Object[] orderBy);
	
	/**
	 * 通过name和lang得到一个实体
	 * @param entity
	 * @param name
	 * @param lang
	 * @return
	 */
	public E load(Class<E> entity,String name,Object lang);
	
	/**
	 * 得到父节点下的所有子节点实体
	 * @param entity
	 * @param top
	 * @param page
	 * @param lang
	 * @param type
	 * @return
	 */
	public List<E> list(Class<E> entity,final int top,final int page,Object lang,List<Integer> type);
	
	public List<E> list(Class<E> entity,int top,int page,Object lang,int type);
	
	public List<Integer> getId(int id);
	
	public boolean getParentId(int id);

}
